//#include<iostream>
//using namespace std;
//
//const int N = 10;
//bool st[N][N];
//int dx[] = {0,0,-1,1};
//int dy[] = {1,-1,0,0};
//int sx, sy, fx, fy;
//int n, m, t;
//int ret;
//void dfs(int i, int j)
//{
//	if(i == fx && j == fy)
//	{
//		ret++;
//		return;
//	}
//	st[i][j] = true; 
//	for(int k = 0; k < 4; k++)
//	{
//		int x = i + dx[k], y = j + dy[k];
//		if(x > n || y > m || x <= 0 || y <= 0 || st[x][y])
//			continue;
//		
//		dfs(x,y);
//	}
//	st[i][j] = false; 
//}
//
//int main()
//{
//	cin >> n >> m >> t;
//	
//	cin >> sx >> sy >> fx >> fy;
//	st[sx][sy] = true;
//
//	while(t--)
//	{
//		int x1,y1; cin >> x1 >> y1;
//		st[x1][y1] = true;
//	}	
//		dfs(sx,sy);
//	cout << ret << endl;
//	
//	return 0;
//} 
//#include<iostream>
//using namespace std;
//const int N = 1e4 + 10;
//
//int f[N][N];
//int main()
//{
//	int n, k; cin >> n >> k;
//	
//	for(int i = 1; i <= n; i++)
//	{
//		cin >> f[i][i];	
//	} 
//	for(int len = 2; len <= n; len++)
//	{
//		for(int i = 1; i + len - 1 <= n; i++)
//		{
//			int j = i + len - 1;
//			if(j - i + 1 < k)
//		}
//	}
//	
//	return 0;
//}
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n,m,c;
int check(int x)
{
	int cnt = 0;
	int l = 1, r = 1;
	while(r <= n)
	{
		while(r <= n && r - l + 1 <= c && a[r] - a[l] <= x)
		{
			r++;
		}
		cnt++;
		l = r;
	}
	return cnt;
}
int main()
{
	cin >> n >> m >> c;
	int l = 0, r = 0;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	sort(a + 1, a + 1 + n);
	r = a[n] - a[1];
	while(l < r)
	{
		int mid = (l + r) / 2;
		if(check(mid) <= m) r = mid;
		else l = mid + 1;
	}
	cout << l << endl;
	return 0;
}

